package com.tenthoundsqps.entity;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableField;

/**
 * 订单实体类
 * 对应数据库表：t_order
 * 
 * 采用分库分表策略：
 * - 数据库分片：按用户ID哈希分为16个库
 * - 表分片：按用户ID哈希分为16张表
 * - 实际表名为：t_order_0 到 t_order_15
 */
@TableName("t_order")
public class Order {
    /**
     * 订单ID，主键
     * 使用MyBatis Plus的自动ID生成策略
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    
    /**
     * 订单编号，唯一标识一个订单
     * 业务主键，用于订单查询
     */
    @TableField("order_no")
    private String orderNo;
    
    /**
     * 用户ID，用于分库分表的分片键
     * 根据用户ID的哈希值确定数据存储的数据库和表
     */
    @TableField("user_id")
    private Long userId;
    
    /**
     * 商户ID
     */
    @TableField("merchant_id")
    private Long merchantId;
    
    /**
     * 商户名称，用于ES全文搜索
     */
    @TableField("merchant_name")
    private String merchantName;
    
    /**
     * 联系电话，用于ES全文搜索
     */
    @TableField("phone_number")
    private String phoneNumber;
    
    /**
     * 订单金额
     */
    @TableField("amount")
    private BigDecimal amount;
    
    /**
     * 订单状态
     * 1:待支付 2:已支付 3:已取消 4:已完成 5:已退款
     */
    @TableField("status")
    private Integer status;
    
    /**
     * 订单创建时间
     */
    @TableField("create_time")
    private LocalDateTime createTime;
    
    /**
     * 订单更新时间
     */
    @TableField("update_time")
    private LocalDateTime updateTime;
    
    /**
     * 是否已归档（用于冷热数据分离）
     * 0:未归档(热数据) 1:已归档(冷数据)
     */
    @TableField("is_archived")
    private Integer archived;
    
    // Getters and Setters
    public Long getId() {
        return id;
    }
    
    public void setId(Long id) {
        this.id = id;
    }
    
    public String getOrderNo() {
        return orderNo;
    }
    
    public void setOrderNo(String orderNo) {
        this.orderNo = orderNo;
    }
    
    public Long getUserId() {
        return userId;
    }
    
    public void setUserId(Long userId) {
        this.userId = userId;
    }
    
    public Long getMerchantId() {
        return merchantId;
    }
    
    public void setMerchantId(Long merchantId) {
        this.merchantId = merchantId;
    }
    
    public String getMerchantName() {
        return merchantName;
    }
    
    public void setMerchantName(String merchantName) {
        this.merchantName = merchantName;
    }
    
    public String getPhoneNumber() {
        return phoneNumber;
    }
    
    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }
    
    public BigDecimal getAmount() {
        return amount;
    }
    
    public void setAmount(BigDecimal amount) {
        this.amount = amount;
    }
    
    public Integer getStatus() {
        return status;
    }
    
    public void setStatus(Integer status) {
        this.status = status;
    }
    
    public LocalDateTime getCreateTime() {
        return createTime;
    }
    
    public void setCreateTime(LocalDateTime createTime) {
        this.createTime = createTime;
    }
    
    public LocalDateTime getUpdateTime() {
        return updateTime;
    }
    
    public void setUpdateTime(LocalDateTime updateTime) {
        this.updateTime = updateTime;
    }
    
    /**
     * 获取订单归档状态
     * @return 0:未归档(热数据) 1:已归档(冷数据)
     */
    public Integer getArchived() {
        return archived;
    }
    
    /**
     * 设置订单归档状态
     * @param archived 0:未归档(热数据) 1:已归档(冷数据)
     */
    public void setArchived(Integer archived) {
        this.archived = archived;
    }
    
    /**
     * 判断订单是否已归档
     * @return true:已归档 false:未归档
     */
    public boolean isArchived() {
        return archived != null && archived == 1;
    }
}